﻿#pragma once

#include "Basic.h"
#include "Coordinate.h"
#include "Calculus.h"
#include "Geodesy.h"
#include "LookupTable.h"
#include "Matrix.h"
#include "Polynomial.h"
#include "TransferFunction.h"
#include "Vector.h"

namespace ASL
{

// 单位制常量
#define FT_TO_M 0.3048
#define IN_TO_M 0.0254
#define LBS_TO_KG 0.4536
#define LBF_TO_N 4.45
#define FT2_TO_M2 0.0929
#define SLUGFT2_TO_KGM2 1.3558
#define KT_TO_M 0.5144
#define BAR_TO_PA 100000.0
#define PSF_TO_PA 47.8803

    // 数学运算类
    class ASL_API MathOperation
    {
    public:
        // 结构组件相对坐标函数
        // 输入 location 结构系组件位置 [X, Y, Z] m
        // 输入 CG 结构系重心位置 [X, Y, Z] m
        // 返回 return 组件相对与重心位置 [X, Y, Z] m
        static ASL::Vector componentX(ASL::Vector &location, ASL::Vector &CG);
    };

    // PID控制器模型
    class ASL_API PIDController
    {
    public:
        // 构造函数
        PIDController();

        // 析构函数
        ~PIDController();

    public:
        // 控制系数类型
        enum CoeffType
        {
            P = 0,
            I,
            D,
        };

        // 输入端口列表
        struct Input
        {
            // 误差信号 -
            double u;
        };

        // 输出端口列表
        struct Output
        {
            // 控制信号 -
            double y;
        };

        // 参数端口列表
        struct Parameter
        {
            // 控制系数 -
            double k[3];

            // 控制项限幅使能 true/false
            bool limitEnable[3];

            // 控制项限幅最小值 -
            double limitMin[3];

            // 控制项限幅最大值 -
            double limitMax[3];
        };

    public:
        // 初始化函数
        // 输入 stepSize 仿真步长 s
        // 返回 return 是否正常执行 true/false
        bool initialize(double stepSize);

        // 单步运行函数
        // 输入 -
        // 返回 return 是否正常执行 true/false
        bool step(void);

    public:
        // 输入端口对象
        PIDController::Input input;

        // 输入端口对象
        PIDController::Output output;

        // 参数端口对象
        PIDController::Parameter parameter;

    private:
        // 积分器
        ASL::Calculus cIntegrator;

        // 微分器
        ASL::Calculus cDerivator;
    };

    // 轮胎地面模型
    class ASL_API LGWheel
    {
    public:
        // 构造函数
        LGWheel();

        // 析构函数
        ~LGWheel();

    public:
        // 输入端口列表
        struct Input
        {
            // 起落架位置 0~1
            double gearPosition;

            // 轮胎转向指令 0~1
            double steerCommand;

            // 刹车操纵指令 0~1
            double brakePosition;

            // 飞行高度 重心相对地面 m
            double altitude;

            // 飞行速度 机体系 [X, Y, Z] m/s
            ASL::Vector vBody;

            // 机体姿态角 [gamma, psi, zeta] deg
            ASL::Vector eular;

            // 机体角速度 机体系 [X, Y, Z] deg/s
            ASL::Vector omega;

            // 重心位置 结构系 [X, Y, Z] m
            ASL::Vector CG;
        };

        // 输出端口列表
        struct Output
        {
            // 合外力 机体系 [X, Y, Z] N
            ASL::Vector force;

            // 合外力矩 机体系 [X, Y, Z] N*m
            ASL::Vector torque;

            // 轮胎触地状态 -
            bool groundReaction;

            // 轮胎转向角度 deg
            double steerAngle;
        };

        // 参数端口列表
        struct Parameter
        {
            // 轮胎安装位置 结构系 [X, Y, Z] m
            ASL::Vector location;

            // 轮胎最大转向角度 deg
            double steerAngle;

            // 轮胎静摩擦系数 -
            double staticCoeff;

            // 轮胎动摩擦系数 -
            double dynamicCoeff;

            // 轮胎滚动摩擦系数 -
            double rollingCoeff;

            // 缓冲器劲度系数 N/m
            double springCoeff;

            // 缓冲器阻尼系数 N/m/s
            double dampingCoeff;
        };

    public:
        // 初始化函数
        bool initialize(void);

        // 单步运行函数
        bool step(void);

    public:
        // 输入端口对象
        LGWheel::Input input;

        // 输入端口对象
        LGWheel::Output output;

        // 参数端口对象
        LGWheel::Parameter parameter;

    private:
        // 坐标系投影矩阵 导航系>机体系
        ASL::Matrix cN2B;

        // 坐标系投影矩阵 导航系>局部系
        ASL::Matrix cN2L;

        // 压缩量 m
        double compressLength;

        // 压缩速度 m
        double compressSpeed;

        // 支撑力 N
        double verticalStrutForce;

        // 纵向摩擦力 N
        double rollForce;

        // 侧向摩擦力 N
        double sideForce;

        // 轮胎侧滑角 deg
        double wheelSlip;
    };

}
